package org.example.day02;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO +
 * 给一个正整数列 nums，一个跳数 jump，及幸存数量 left。运算过程为：从索引为0的位置开始向后跳，中间跳过 J 个数字，命中索引为J+1的数字，该数被敲出，并从该点起跳，以此类推，直到幸存left个数为止。然后返回幸存数之和。 <br> 约束： <br> 1）0是第一个起跳点。 <br> 2）起跳点和命中点之间间隔 jump 个数字，已被敲出的数字不计入在内。 <br> 3）跳到末尾时无缝从头开始（循环查找），并可以多次循环。 <br> 4）若起始时 left&gt;len(nums) 则无需跳数处理过程。 <br> <br> /** <br> * nums: 正整数数列，长度范围 [1,10000] <br> * jump: 跳数，范围 [1,10000] <br> * left: 幸存数量，范围 [0,10000] <br> * return: 幸存数之和 <br> * <br> int sumOfLeft(int[] nums,int jump,int left)
 * <p>
 * 给一个正整数列 nums，一个跳数 jump，及幸存数量 left。
 * 运算过程为：从索引为0的位置开始向后跳，中间跳过 J 个数字，命中索引为J+1的数字，该数被敲出，并从该点起跳，以此类推，直到幸存left个数为止。然后返回幸存数之和。
 * 约束：
 * 1）0是第一个起跳点。
 * 2）起跳点和命中点之间间隔 jump 个数字，已被敲出的数字不计入在内。
 * 3）跳到末尾时无缝从头开始（循环查找），并可以多次循环。
 * 4）若起始时 left>len(nums) 则无需跳数处理过程。
 * * nums: 正整数数列，长度范围 [1,10000]
 * * jump: 跳数，范围 [1,10000]
 * * left: 幸存数量，范围 [0,10000]
 * * return: 幸存数之和
 * * int sumOfLeft(int[] nums,int jump,int left)
 * @date 2024/3/11 15:21
 */
public class test021 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] numsInput = scanner.nextLine().split(",");  // 输入数组的字符串表示，以逗号分隔
        int[] nums = new int[numsInput.length];  // 存储转换后的整数数组
        for (int i = 0; i < numsInput.length; i++) {
            nums[i] = Integer.parseInt(numsInput[i]);  // 将字符串转换为整数并存入数组
        }
        int jump = Integer.parseInt(scanner.nextLine());  // 跳跃步数
        int left = Integer.parseInt(scanner.nextLine());  // 剩余数

        System.out.println(sumOfLeft(nums, jump, left));  // 调用方法计算结果并输出
    }

    public static int sumOfLeft(int[] nums, int jump, int left) {
        if (left >= nums.length) {
            int sum = 0;
            for (int num : nums) {
                sum += num;  // 当剩余数大于等于数组长度时，直接返回数组所有元素的和
            }
            return sum;
        }

        int index = 0;  // 索引指针初始化为0
        List<Integer> surviors = new ArrayList<>();  // 存储剩余元素的列表
        for (int num : nums) {
            surviors.add(num);  // 将数组元素添加到列表中
        }

        while (surviors.size() > left) {  // 当需要移除的元素数量大于0时循环继续
            index = (index + jump + 1) % surviors.size();  // 计算下一个移除元素的索引位置，由于可能循环，所以取余数
            surviors.remove(index);  // 移除该索引位置的元素
            index--;  // 因为移除元素后，后面的元素会往前移，所以不需要更新索引，但是为了保证正确性，需要将索引减1
        }

        int sum = 0;
        for (int num : surviors) {
            sum += num;  // 计算剩余元素的和
        }
        return sum;
    }
}

